<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="coinfaces">

        <title>netCDF</title>

    <link rel="stylesheet" href="../theme/css/style.css">
    <link rel="stylesheet" href="../theme/css/pygments.css">



</head>

<body>
    <div class="content">
<h1>netCDF</h1>    <p>
        under
    </p>
    <p>
        in <a href="../categories/draft/">draft</a>
    </p>
    <p>Published: 2020-02-27</p>


    <h4>netCDF数据格式（5种）</h4>
<ul>
<li>the classic format (CDF-1)</li>
<li>the 64-bit offset format (CDF-2)</li>
<li>the 64-bit data format (CDF-5)</li>
<li>the netCDF-4 format (netCDF4)</li>
<li>the netCDF-4 classic model format (netCDF4 classic)</li>
</ul>
<p>前3种俗称netCDF3格式，专业代号CDF-1、CDF-2和CDF-5，读写不需要链接HDF5库。</p>
<p>后2种本质上是HDF5格式，需要链接HDF5读写库才能读写，有时会用netCDF4泛称这两种格式，在这里用netCDF4和netCDF4 classic这两个名字来区分。</p>
<p>这5种数据格式出现的时间顺序是：</p>
<table>
<thead>
<tr>
<th align="left">Format</th>
<th align="right">Year</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">CDF-1</td>
<td align="right">1989?</td>
</tr>
<tr>
<td align="left">CDF-2</td>
<td align="right">2004</td>
</tr>
<tr>
<td align="left">netCDF4</td>
<td align="right">2008</td>
</tr>
<tr>
<td align="left">netCDF4 classic</td>
<td align="right">2008</td>
</tr>
<tr>
<td align="left">CDF-5</td>
<td align="right">2016</td>
</tr>
</tbody>
</table>
<p>判断数据格式的命令：</p>
<div class="highlight"><pre><span></span><code>ncdump -k foo.nc  <span class="c1"># 区别netCDF4或者netCDF4 classic</span>
od -An -c -N4 foo.nc  <span class="c1"># 直接读文件的前4个字符</span>
<span class="c1"># C   D   F 001</span>
<span class="c1"># C   D   F 002</span>
<span class="c1"># C   D   F 005</span>
<span class="c1"># 可能需要跳过前512、1024、2048…个字节才看到以下4个字符</span>
<span class="c1"># 211   H   D   F</span>
file foo.nc  <span class="c1"># 可以区别CDF或者HDF格式</span>
</code></pre></div>


<h4>数据模型（2种）</h4>
<p><a href="https://www.unidata.ucar.edu/netcdf/workshops/2008/datamodel/NcClassicModel.html">classic model</a></p>
<p>CDF-1、CDF-2、CDF-5和netCDF4 classic数据格式使用这种数据模型</p>
<p><a href="https://www.unidata.ucar.edu/netcdf/workshops/2008/netcdf4/Nc4DataModel.html">enhanced model</a></p>
<p>netCDF4数据模式使用这种模型</p>
<h4>Unidata的netCDF软件版本</h4>
<p>2008年C读写库4.0发布时，Unidata也同时发布了netCDF-3.6.3，后者只支持CDF-1和CDF-2，前者默认支持CDF-1和CDF-2，也可以选择支持netCDF4 (classic)。netCDF-4.4.0之后的版本加入了CDF-5格式的支持。现在（2019年）netCDF只发布一种的同时支持5种数据格式（可选）读写的C读写库（4.x版本），不再发布只支持CDF-x格式的C读写库。</p>
<p>关于兼容性Unidata给出了两个承诺：</p>
<ul>
<li>向下，新发布的netCDF软件将支持之前发布的所有netCDF数据格式的读写</li>
<li>向上，netCDF读写库对调用它的C和Fortran程序提供兼容的API，即利用文档中公布的API写成的C和Fortran程序不需要改动就可以继续使用（可能需要重新编译链接）</li>
</ul>
<h4>数据格式转化</h4>
<div class="highlight"><pre><span></span><code>nccopy -k <span class="m">4</span> -d <span class="m">1</span> foo3.nc foo4.nc  <span class="c1"># netCDF软件自带，nccopy的用法详见nccopy -h</span>
ncks -7 foo3.nc foo4c.nc  <span class="c1"># NCO提供的工具</span>
<span class="c1"># ncdump + ncgen的这种方法理论上可行，但因为性能问题，没有人会用它来处理现实数据</span>
ncdump small3.nc &gt; small.cdl
ncgen -o small4.nc -k netCDF-4-classic small.cdl
</code></pre></div>


<p>下面第一个命令是把“netCDF3格式”的文件转化成netCDF4格式，但我怀疑它会把文件转化成netCDF4 classic格式，因为我见过一个脚本用这样的命令来压缩WRF输出，但同一个目录下的数据都是netCDF4 classic格式的。</p>
<p>把一个CDF-x格式的文件转化成HDF5格式的文件，为保持最大的兼容性，比较合理的方案应该是先转化成netCDF4 classic格式（例如需要减小文件占用的存储空间），在扩展文件的时候，如果需要netCDF4格式独有的特性，再转化成netCDF4格式。</p>
<p>在处理上述压缩后的WRF输出时，因为ARWpost程序没有链接HDF5读写库，一开始在处理前用nccopy将它们转化成“netCDF3格式”，后来因为性能问题，将ARWpost重新编译，链接netCDF4和HDF5读写库，也能直接处理这批数据。</p>
<p>从这个例子可以看出上述策略的2个好处：</p>
<ol>
<li>遇到不支持netCDF4 (classic)格式的软件可以随时把数据转回netCDF3格式再处理</li>
<li>之前写的程序，重新编译链接后就可以直接处理转化后的数据</li>
</ol>
<h4>API版本</h4>
<p>来自<a href="https://www.unidata.ucar.edu/software/netcdf/docs/faq.html#formatsdatamodelssoftwarereleases">netCDF FAQ</a></p>
    </div>
<nav class="nav sidebar">
    <div class="siteinfo">
        <div class="sitename"><a href="..">coinfaces</a></div>
        <div class="tagline">Another Side of Life</div>
    </div>

        <a href="../categories/">categories</a>
        <a href="..">&larr; Home</a>
</nav><footer class="footer">
    <span>
        &copy; jpli &middot;
        under <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA 4.0</a>
    </span>
    |
    <span>
        Powered by:
        <a href="http://blog.getpelican.com/">Pelican</a>
    </span>
</footer></body>
</html>